#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=2e5+10,mod=1e9+7;
int n,dep[N],Mxd,dfn[N],num,f[N][21];
vector<int> e[N];
vector<int> arr[N];
void dfs(int u,int fa) {
	f[u][0]=fa;
	for(int i=1; i<=20; i++) f[u][i]=f[f[u][i-1]][i-1];
	dfn[u]=++num;
	dep[u]=dep[fa]+1; Mxd=max(Mxd,dep[u]);
	arr[dep[u]].push_back(u);
	for(int v:e[u]) if(v!=fa) {
		dfs(v,u);
	}
}
int Lca(int u,int v) {
	if(dep[v]>dep[u]) swap(u,v);
	for(int i=20; i>=0; i--) 
		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	if(u==v) return u;
	for(int i=20; i>=0; i--)
		if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	return f[u][0];
}
int p[N],tot,A[N],tc;
bool cmp(int x,int y) {
	return dfn[x]<dfn[y];
}
vector<int> vt[N];
void buildvt() {
	p[++tot]=1;
	sort(p+1,p+1+tot,cmp);
	tc=0;
	for(int i=1; i<tot; i++) {
		A[++tc]=p[i]; A[++tc]=Lca(p[i],p[i+1]);
	} A[++tc]=p[tot];
	sort(A+1,A+1+tc,cmp);
	tc=unique(A+1,A+1+tc)-A-1;
	for(int i=1; i<tc; i++) {
		int lc=Lca(A[i],A[i+1]);
		vt[lc].push_back(A[i+1]);
	}
}
int dp[N][2],Ans;
int inv(int a) {
	int res=1,b=mod-2;
	for(; b; b>>=1) {
		if(b&1) res=1ll*res*a%mod;
		a=1ll*a*a%mod;
	}
	return res;
}
void solve(int u) {
	int son=0;
	for(int v:vt[u]) {
		solve(v); son++;
	}
	if(son==0) {
		dp[u][0]=dp[u][1]=1; return ;
	}
	int s=1,s2=1;
	for(int v:vt[u]) s2=1ll*s2*dp[v][0]%mod;
	for(int v:vt[u]) {
		dp[u][1]=(dp[u][1]+1ll*dp[v][1]*s2%mod*inv(dp[v][0]))%mod;
		s=1ll*s*(dp[v][1]+dp[v][0])%mod;
	}
	dp[u][0]=(s+mod-dp[u][1])%mod;
}
int pw[N];
int main() {
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	scanf("%d",&n); n++;
	for(int i=2; i<=n; i++) {
		int u; scanf("%d",&u);
		u++; e[u].push_back(i);
	}
	dfs(1,1);
	pw[0]=1;
	for(int i=1; i<=n; i++) pw[i]=2ll*pw[i-1]%mod;
	for(int i=1; i<=Mxd; i++) {
		tot=0;
		for(int u:arr[i]) p[++tot]=u;
		buildvt();
		solve(1);
		Ans=(Ans+1ll*pw[n-arr[i].size()]*dp[1][1])%mod;
		for(int j=1; j<=tc; j++)
			dp[A[j]][0]=dp[A[j]][1]=0,vt[A[j]].clear();
	}
	printf("%d\n",Ans);
	return 0;
}
